iT邦幫忙

3

python抓網頁data,及做圖表之十五:抓財務分析資料查詢彙總表產生的例外情況

  • 分享至 

  • xImage
  •  

永遠不要問理髮師你是否需要理髮!
巴菲特

類似的造句:不要問賣車的業務,你是否需要車子。
不要問理財的專員,你是否需要理財。
不要問吸血鬼,你是否需要血液。

昨晚的code:

def td2num(td):
    return float(td.get_text().strip().replace(',',''))

j=0
for tr in trs:
    j=j+1
    #print(j)
    tds=tr.find_all('td')
    i=0
    stk=[];stk.append(101)   
    #print(tds[0].get_text())
    for td in tds:
        
        i=i+1
        if i>2 :
            if 'NA' in tds[i-1].get_text() or '*****' in tds[i-1].get_text() or len(tds[i-1].get_text().strip())==0 :  #==''
                stk.append(0)
            else:    
                stk.append(td2num(tds[i-1]))
        else:
            stk.append(tds[i-1].get_text())
           
    print(stk)
    
output:
[101, '910708', '新傳媒', 23.14, 127.46, 172.42, 164.93, 42.78, 5.57, 65.52, 73.73, 4.95, 147.0, 89.22, 5.9, 7.88, 368.29, 414.41, 5.87, 0.13, 31.36, 52.07, 4.03]
[101, '910801', '金衛醫療', 29.0, 433.0, 77.0, 75.0, 3180.0, 2.24, 162.94, 7.13, 51.19, 0.45, 0.06, 3.0, 5.0, 42.0, 106.0, 41.0, 0.3, 1.0, 112.0, 1.0]
[101, '910861', '神州', 69.88, 840.59, 143.73, 85.26, 725.95, 6.96, 52.44, 12.45, 29.31, 55.07, 2.6, 6.36, 18.99, 43.0, 56.46, 2.05, 5.01, 2.76, 48.49, 0.39]
[101, '910948', 'Z-OBEE', 38.41, 3950.22, 206.26, 142.02, 3.02, 3.28, 111.28, 10.96, 33.3, 61.65, 0.96, 3.74, 3.8, 115.73, 94.9, 2.37, 0.2, 0, 0, 0]
[101, '9110', '越南製造', 17.81, 584.78, 461.12, 372.11, 14378.09, 44.89, 8.13, 4.98, 73.29, 6.27, 0.96, 0.35, 0.42, -672.21, -103.55, 0.36, 0.03, 28.71, 75.63, 2.29]
[101, '911201', '僑威', 46.93, 96.64, 137.45, 116.55, 445.07, 2.7, 135.18, 11.23, 32.5, 3.64, 1.18, 3.49, 3.38, 441.84, 363.11, 2.95, 0.79, 13.31, 89.29, 8.4]
[101, '911602', '華豐泰國', 18.84, 226.47, 348.6, 91.29, 211.78, 5.48, 66.6, 3.66, 99.72, 3.49, 1.25, 8.71, 10.97, 21.75, 23.68, 6.76, 0.23, 104.55, 356.15, 10.71]

其中,
網頁上會放一些特別的字元

'NA' in tds[i-1].get_text() or '*****' in tds[i-1].get_text() or len(tds[i-1].get_text().strip())==0 :

前兩個還容易排掉,反而是最後一個空白花了筆者不少時間。

首先它是發生在204筆,意謂著前面203筆是正確的。

可能需要換一個比較friendly的除錯界面。在筆數多的data, 要找問題,不能只靠靈感。

開個TABLE來放年度data.

import sqlite3
conn = sqlite3.connect('revenue.db')
c = conn.cursor()
c.execute('''CREATE TABLE fny
             (yr real,   cpyid text,cpyname text, r01 real , r02 real , r03 real , r04 real , r05 real ,
                                                  r06 real , r07 real , r08 real , r09 real , r10 real ,
                                                  r11 real , r12 real , r13 real , r14 real , r15 real ,
                                                  r16 real , r17 real , r18 real , r19 real , r20 real 
			 )''')
conn.commit() 

整合一下片斷的code, 合成一段。

import urllib.request
from bs4 import BeautifulSoup
import sqlite3
conn = sqlite3.connect('revenue.db')
c = conn.cursor()

url = 'http://mops.twse.com.tw/mops/web/ajax_t51sb02?'\
        'encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year=101'
response = urllib.request.urlopen(url)
html = response.read()
sp = BeautifulSoup(html.decode('utf8'))    
tbls=sp.find_all('table',attrs={ 'class' : "hasBorder"}) 
trs=tbls[0].find_all('tr',attrs={ 'class' : ["odd","even"]}) 

def td2num(td):
    return float(td.get_text().strip().replace(',',''))

j=0
for tr in trs:
    j=j+1
    #print(j)
    tds=tr.find_all('td')
    i=0
    stk=[];stk.append(101)   
    #print(tds[0].get_text())
    for td in tds:
        
        i=i+1
        if i>2 :
            if 'NA' in tds[i-1].get_text() or '*****' in tds[i-1].get_text() or len(tds[i-1].get_text().strip())==0 :  #==''
                stk.append(0)
            else:    
                stk.append(td2num(tds[i-1]))
        else:
            stk.append(tds[i-1].get_text())
           
    print(stk)
    c.execute('INSERT INTO fny VALUES (?,?,? ,?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,? )', stk)
    
conn.commit()

在財報狗的網站裏,這麼寫到:
資產報酬率衡量的標準,長期至少要比定存利率、長期公債利率高為佳(約5%),

股東權益報酬率越高,代表公司位股東賺回的獲利越高。 股神巴菲特持有的公司都具有高ROE特色(高於10~15%)

而資產報酬率,排在數字的第12欄,股東權益報酬率排在第13欄。

for row in  c.execute('select cpyname,r12,r13 from fny where yr=101 and r12>=5 and r13>=10  '):
    print(row) 

再嚴格一點:

for row in  c.execute('select cpyname,r12,r13 from fny where yr=101 and r12>=10 and r13>=15  '):
    print(row) 

再更嚴格一點:

for row in  c.execute('select cpyname,r12,r13 from fny where yr=101 and r12>=20 and r13>=25  '):
    print(row) 

output:
('黑松', 44.44, 48.98)
('大魯閣', 33.32, 45.16)
('儒鴻', 24.56, 32.26)
('廣隆光電', 21.21, 27.09)
('葡萄王', 22.76, 26.57)
('中碳', 27.0, 31.3)
('五鼎', 21.47, 27.79)
('鑫永銓', 20.04, 26.79)
('德律科技', 24.58, 29.64)
('奇偶科技', 23.87, 29.94)
('志信', 27.29, 38.18)
('晶華酒店', 20.83, 34.98)
('晶睿', 24.23, 32.36)
('鑫禾', 22.18, 26.01)
('長虹', 25.76, 47.56)
('瑞儀光電', 21.97, 27.36)
('立錡', 20.5, 27.13)
('振樺電子', 20.44, 29.73)
('可寧衛', 31.05, 33.25)
('F-金麗', 23.86, 33.86)
('欣巴巴', 54.54, 72.28)
('偉聯', 69.87, 94.7)

從財報來看,101年ROA/ROE報現亮麗的股票,應該是這些。

**小結:**這麼多數字,沒有用程式,資料庫,要如何管理呢?
大多的行動股市APP, 都是個股一枝一枝在有限畫面裏看圖。沒有多家並列,很難看出那家的獲利佳。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言